/*
 * Copyright 2010,2011 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.schnipsel.swt.editor.basis;

import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;

import de.mnit.basis.daten.struktur.container.Engpass;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.bild.SWT_TextEditor;
import de.mnit.basis.swt.statisch.FarbManager;

/**
 * @author Michael Nitsche
 * 16.11.2010	Erstellt
 */
public class Fn_ZeilenHintergrund {

	public void init(final SWT_TextEditor editor, final int[] zeilenHGFarbe) {
		final Engpass<Integer> zeilenHintergrund=Engpass.neu(-1);


		editor.swt().addKeyListener(new KeyListener(){
			public void keyReleased(KeyEvent ke) {}
			public void keyPressed(KeyEvent ke) {
				iUpdate(editor.swt(), zeilenHintergrund, zeilenHGFarbe);
			}
		});
		editor.swt().addMouseListener(new MouseListener(){
			public void mouseDoubleClick(MouseEvent arg0) {}
			public void mouseUp(MouseEvent arg0) {
				iUpdate(editor.swt(), zeilenHintergrund, zeilenHGFarbe);
			}
			public void mouseDown(MouseEvent arg0) {
				iUpdate(editor.swt(), zeilenHintergrund, zeilenHGFarbe);
			}
		});

		//Event wird VOR dem Löschen von Text geworfen!!!
//		editor.swt().addCaretListener(new CaretListener() {
//			public void caretMoved(CaretEvent event) {
//				if(event.caretOffset==0)  //#0000338: BUGFIX: Beim Ausschneiden oder Löschen blieb eine Zeile stehen!
//					return;
//				iUpdate(editor.swt(), zeilenHintergrund, zeilenHGFarbe);
//			}
//		});
	}

	private void iUpdate(StyledText st, Engpass<Integer> aktuell, int[] farbe) {
		int zeile=st.getLineAtOffset(st.getCaretOffset());
		if(aktuell.g()==zeile) //BUGFIX: Sonst Fehler beim Markieren und Ersetzen des letzten Wortes!!!
			return;

		if(aktuell.g()>=0 && aktuell.g()<st.getLineCount())
			try {
				st.setLineBackground(aktuell.g(), 1, null);
			}
			catch(ArrayIndexOutOfBoundsException e) {
				Fehler.zeig(e, false, "Puffer: "+aktuell.g()+"\nAnzahl: "+st.getLineCount());
			}

		st.setLineBackground(zeile, 1, FarbManager.gFarbe(farbe));
		aktuell.s(zeile);
	}

}
